博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTML目录生成工具
阅读量:4619 次
发布时间:2019-06-09

本文共 5985 字,大约阅读时间需要 19 分钟。

目录

内容简介

园子里面很多博主都会为自己的博文创建目录,方便大家浏览。我很好奇大家是怎么做的,是不是有自动生成目录的工具可以推荐一下(我知道word可以,但是直接贴word文档会生成很多多余的html tag)。

前几天写目录项实在有点多,手动加起来太麻烦了,我尝试搜了下没有找到,于是写了几行代码来完成这工作。拿出来分享给有同样需要的朋友。

工具代码

using System;using System.IO;using System.Text;using System.Text.RegularExpressions;namespace HtmlIndexGenerator{    class Program    {        const string HeaderPattern = @"
[1-6])[\s\S]*?>[\s\S]*?"; const string TagPattern = @"<[\s\S]*?>"; const string IdPattern = "(id|name)=\"(?
[\\s\\S]*?)\""; const int MaxHeaderLimit = 6; const string H1Style = @"font-weight:bold"; const string H2Style = @""; const string H3Style = @""; const string H4Style = @""; const string H5Style = @""; const string H6Style = @"font-size:10px;"; static string[] HeaderStyles = new string[]{ H1Style, H2Style, H3Style, H4Style, H5Style, H6Style }; static void Main(string[] args) { string fileName; int limit; ParseParameter(args, out fileName, out limit); string html = GetHtml(fileName); if (string.IsNullOrEmpty(html)) return; string index = GenerateIndex(html, limit); string outputFile = "index.htm"; File.WriteAllText(outputFile, index, Encoding.UTF8); Console.WriteLine("{0} generated.", outputFile); } ///
/// Prints help document. /// private static void PrintHelp() { Console.WriteLine("Usage: IndexGen.exe [filename] [-l] level"); Console.WriteLine("-l: header level limit, -l 3 limit the output to

"); Console.WriteLine("Example: IndexGen.exe page.htm"); } /// /// Parses command line paramters. /// /// Input parameters /// Output parameter for parsed file name. Null if parse failed. /// Output parameter for header level limit. private static void ParseParameter(string[] args, out string fileName, out int limit) { fileName = null; limit = MaxHeaderLimit; for (int i = 0; i < args.Length; i++) { if (args[i].Equals("-l", StringComparison.InvariantCultureIgnoreCase)) { if (i + 1 >= args.Length || !int.TryParse(args[i + 1], out limit)) { Console.WriteLine("Invalid parameter for -l"); PrintHelp(); return; } } } if (args.Length > 0) { fileName = args[args.Length - 1]; } } /// /// Reads html content according to specified file name. /// /// File name ///
Html content of the specific file.
private static string GetHtml(string fileName) { string html = null; if (string.IsNullOrEmpty(fileName)) { Console.WriteLine("Specify a file name"); PrintHelp(); return html; } if (!File.Exists(fileName)) { Console.WriteLine("File {0} dose not exist", fileName); PrintHelp(); return html; } // Auto defect file encoding. using (StreamReader reader = new StreamReader(fileName, detectEncodingFromByteOrderMarks: true)) { Encoding encoding = reader.CurrentEncoding; html = File.ReadAllText(fileName, encoding); } return html; } /// /// Generates the index html. /// /// Html content of specified file. /// Header limit ///
Generated index html
private static string GenerateIndex(string html, int limit) { Regex regex = new Regex(HeaderPattern, RegexOptions.IgnoreCase); Regex regexId = new Regex(IdPattern, RegexOptions.IgnoreCase); MatchCollection headerMatches = regex.Matches(html); int previousLevel = 1; StringBuilder indexBuilder = new StringBuilder(); indexBuilder.Append("
"); indexBuilder.Append("
    "); foreach (Match headerMatch in headerMatches) { int currentLevel = int.Parse(headerMatch.Groups["level"].Value); string header = Regex.Replace(headerMatch.Value, TagPattern, string.Empty); Match idMatch = regexId.Match(headerMatch.Value); string id = idMatch.Success ? idMatch.Groups["id"].Value : null; string link = string.IsNullOrEmpty(id) ? header : string.Format("
    {1}", id, header); if (currentLevel == previousLevel) { indexBuilder.AppendFormat("
  • {0}
  • ", link, HeaderStyles[currentLevel - 1]); } else if (currentLevel > previousLevel && currentLevel <= limit) { indexBuilder.AppendFormat("
    • {0}
    • ", link, HeaderStyles[currentLevel - 1]); previousLevel = currentLevel; } else if (currentLevel < previousLevel) { indexBuilder.AppendFormat("
  • {0}
  • ", link, HeaderStyles[currentLevel - 1]); previousLevel = currentLevel; } } indexBuilder.Append("
"); return indexBuilder.ToString(); } }}

使用方法

将程序编译成执行文件,把博文存成本地文件,注意要存成unicode或utf-8,通过命令行运行。一个名叫index.htm的文件会生成在相同目录下。

如果你只希望限制生成目录的级数,可以用 -l 参数指定,-l 3代表只生成<h1> 到<h3>的目录。

双击打开后是这个样子,

接下来需要做的是将生成的内容复制粘贴到博文你想放目录的地方。简单的目录就生成了,参看。

如果你想更改样式,可以直接修改代码中对不同的header的样式定义。

工具改进

这只是个小工具,肯定有很多让小伙伴们惊呆的不足,

  • 首先不应该用正则表达式解析html,具体原因可以看,如果真的要分析html,.net推荐使用,python推荐使用,我这里不想再引入外部库,所以假设我们解析的html都是标准格式。
  • 另外我没写代码去生成标题的id属性,因为很多朋友希望id是有意义的名字而不简单的header1、lable2之类的,所以id还是需要你自己添加,不然超链接出不来。 <h1 id="intro"></h1>
  • 也尝试把这段代码转换成powershell脚本省了大家编译,有介绍如何做的方法,可惜插件也有硬伤,有些语法还不支持,比如using, out 参数等。

另外如果大家有好的工具也请推荐下,这里抛砖引玉了。

转载于:https://www.cnblogs.com/developersupport/p/html-index-generator.html

你可能感兴趣的文章
URI、URL 和 URN的区别
查看>>
根据表达式序列(前缀、中缀、后缀)构建表达式树
查看>>
mysql性能优化
查看>>
【SqlServer系列】语法定义符号解析
查看>>
Color Length UVA - 1625
查看>>
TLS/SSL
查看>>
webpack笔记(4)对图片的处理
查看>>
如果判断一个dom 对像?
查看>>
搜索引擎的反作弊问题
查看>>
nginx lua 01
查看>>
计算机网络 chapter 8 因特网上的音频/视频服务
查看>>
c++输入输出流读取文件
查看>>
Python数据类型之“数字(numerics)”
查看>>
zoj2319Beautiful People Dp
查看>>
图片加载 背景色块问题
查看>>
Static Binding (Early Binding) vs Dynamic Binding (Late Binding)
查看>>
搭建git服务器
查看>>
iOS之UIDynamic UI动力学使用步骤
查看>>
poj 2498 动态规划
查看>>
Windows Phone 7中使用PhoneApplicationService类保存应用程序状态
查看>>